package persistentie;
import domein.Locatie;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.HashMap;
import java.util.Map;
import javax.swing.tree.DefaultMutableTreeNode;

public class LocatiesMapper extends Mapper<Locatie>{
	
	private static final String querySelectLanden = "SELECT * FROM locaties WHERE land LIKE ";
	private WaarnemingenMapper waarnemingenMapper = new WaarnemingenMapper();
	private long laatsteSleutel;
	
	public Map<String, Locatie> read(String landCode) throws SQLException,IllegalStateException, ClassNotFoundException {
		Connectie connectie = new Connectie();
		Map<String, Locatie> map = new HashMap<String, Locatie>();
		ResultSet resultSet;

		try {
			resultSet = connectie.executeQuery(querySelectLanden + "\"" + landCode + "\"");

			while (resultSet.next()) {
				int idLocatie = resultSet.getInt("idLocatie");
				String naamLocatie = resultSet.getString("naamLocatie");
				float breedtegraad = resultSet.getFloat("breedtegraad");
				float lengtegraad = resultSet.getFloat("lengtegraad");
				int hoogte = resultSet.getInt("hoogte");
				int editable = resultSet.getInt("editable");
				
				Locatie locatie = new Locatie(idLocatie, naamLocatie, breedtegraad, lengtegraad, hoogte,editable);
				map.put(naamLocatie, locatie);

			}

		} catch (Exception e) {
			e.printStackTrace();
			System.out.print("error");
		}

		connectie.closeConnection();
		
		return map;
	}
	
	public String findLand(String naamLand)  throws SQLException{
		Connectie connectie = new Connectie();
		ResultSet resultSet;
		String codeLand = "";

		try 
		{
			resultSet = connectie.executeQuery("SELECT * FROM landen WHERE naamLand Like '" + naamLand + "'");

			while (resultSet.next()) 
			{
				codeLand = resultSet.getString("codeLand");
			}

		}
		catch (Exception e) 
		{
			e.printStackTrace();
			System.out.print("error");
		}

		connectie.closeConnection();

		return codeLand;
	}
	
	public int findLocatie(String naamLocatie)  throws SQLException{
		Connectie connectie = new Connectie();
		ResultSet resultSet;
		int idLocatie = 0;

		try 
		{
			resultSet = connectie.executeQuery("SELECT * FROM locaties WHERE naamLocatie Like '" + naamLocatie + "'");

			while (resultSet.next()) 
			{
				idLocatie = resultSet.getInt("idLocatie");
			}

		}
		catch (Exception e) 
		{
			e.printStackTrace();
			System.out.print("error");
		}

		connectie.closeConnection();

		return idLocatie;
	}
	
	public void schrijf(DefaultMutableTreeNode parent,String naamLocatie,float breedtegraad, float lengtegraad, int hoogte) throws SQLException, ClassNotFoundException{
		
		Connectie connectie = new Connectie();
		Connection conn = connectie.getConnection();  
		ResultSet key;
		
		PreparedStatement insert = conn.prepareStatement("INSERT INTO locaties (naamLocatie,breedtegraad,lengtegraad,hoogte,land,idLocatie, editable) VALUES (?, ?, ?, ?, ?, null,1)", Statement.RETURN_GENERATED_KEYS);
		insert.setString(1, naamLocatie); 
		insert.setDouble(2, breedtegraad);
		insert.setDouble(3, lengtegraad);
		insert.setInt(4, hoogte);
		insert.setString(5, findLand(parent.toString()));
		     
		try 
		{
			insert.executeUpdate();
			key = insert.getGeneratedKeys();
			if(key.next())
				laatsteSleutel = key.getLong(1);
			else
				laatsteSleutel = -2;
			
		}
		catch (Exception e) 
		{
			e.printStackTrace();
			System.out.print("error");
		}
		
		connectie.closeConnection();
		
	}

	public int getLaatsteSleutel() {
		return (int)laatsteSleutel;
	}

	public void wijzig(Locatie locatie){
	

	String sql;     
	
	sql = "UPDATE locaties SET " +
			"naamLocatie= '"+ locatie.getNaamLocatie() +"' ," +
			"breedtegraad= '"+ locatie.getBreedtegraad() +"' ," +
			"lengtegraad= '"+ locatie.getLengtegraad() +"' ," +
			"hoogte="+ locatie.getHoogte() + " WHERE idLocatie = '" + locatie.getIDLocatie() + "'";
									
	try 
	{
		Connectie connectie = new Connectie();
		Connection conn = connectie.getConnection();
		Statement statement = conn.createStatement();
		statement.executeUpdate(sql);
		connectie.closeConnection();
	}
	catch (Exception e) 
	{
		e.printStackTrace();
	}
	
	
	
}

	public void verwijder(DefaultMutableTreeNode parent) throws SQLException, ClassNotFoundException{
	
	Connectie connectie = new Connectie();
	Connection conn = connectie.getConnection();
	Statement statement = conn.createStatement();
	String sql;     
	
	int locatieID = findLocatie(parent.toString());
	waarnemingenMapper.verwijder(locatieID);
	
	sql = "DELETE FROM locaties WHERE idLocatie = '" + locatieID + "'";
									
	try 
	{
		statement.executeUpdate(sql);
	}
	catch (Exception e) 
	{
		e.printStackTrace();
	}
	
	connectie.closeConnection();
	
}


}